package com.ux.util
{
	/**
	 * @author winnie
	 */	
	public class XmlParsingUtil
	{
		
		
		/**
		 * @param __nodeName 검색할 노드명
		 * @param __data 결과 xml 원본
		 * @param __isTrim 좌우 공백을 없앰
		 * @return object 배열로 반환
		 */		
		public static function getListFromResultData( __data:Object, __nodeName : String, __isTrim : Boolean = false ):Array
		{
			
			var __list : Array = [];
			
			// 우선 노트 명에 맞는 xml 을 가져오고
			var xmlData : XMLList = XMLList(getElementList( XML(__data) , __nodeName ));
			
			// item의 length 만큼  for문을 돌면서
			for each( var item:XML in xmlData )
			{
				var obj : Object = {};
				// item[n]번째의 노드명과, 노드값을 각각 오브젝트에 담아 배열에 다시 넣는다.
				for each( var dataItem:XML in item.children() )
				{
					if( dataItem.localName() == null )
					{
						obj = dataItem.toString();
						if( __isTrim )
						{
							obj = StringUtils.trim( obj as String );
						}
					}
					else
					{
						obj[ dataItem.localName() ] = dataItem.toString();
						if( __isTrim )
						{
							obj[ dataItem.localName() ] = StringUtils.trimLeft( StringUtils.trimRight( obj[ dataItem.localName() ] ) );
						}
					}
					
				}
				
				__list.push( obj );
			}
			
			return __list;
		}
		
		
		
		/**
		 * @param __nodeName 검색할 노드명
		 * @param __data 결과 xml 원본
		 * @param __isTrim 좌우 공백을 없앰
		 * @return object 로 반환
		 */		
		public static function getObjFromResultData( __data:Object, __nodeName : String, __isTrim : Boolean = false ):Object
		{
			var obj : Object = {};
			
			// 우선 노트 명에 맞는 xml 을 가져오고
			var xmlData : XMLList = XMLList(getElementList( XML(__data), __nodeName ));
			
			// item[n]번째의 노드명과, 노드값을 각각 오브젝트에 담아 배열에 다시 넣는다.
			for each( var dataItem:XML in xmlData.children() )
			{
				obj[ dataItem.localName() ] = dataItem.toString();
				
				if( __isTrim )
				{
					obj[ dataItem.localName() ] = StringUtils.trimLeft( StringUtils.trimRight( obj[ dataItem.localName() ] ) );
				}
			}
			
			
			var i : int = 0;
			var tempData : String = "";
			for each( var objData : String in obj )
			{
				i++;
				tempData = objData;
			}
			
			// 만약 object 의 자식이 1개뿐이라면 바로 데이터 반환 
			return ( i == 1 ) ? tempData : obj;
		}
		
		
		/**
		 * @param __data : 최초 xml 데이타
		 * @param __compareNodeName : 비교하고자하는 노드 풀 네임. ( list.item.NUM )
		 * @param __compareValue : 비교하고자 하는 노드 값
		 * @param __returnNodeName : 리턴받고자 하는 노드 풀네임. ( list.item )
		 * @return Object 
		 */		
		public static function findItemAndGetObj( __data:Object , __compareNodeName:String, __compareValue : String,  __returnNodeName:String = ""  ):Object
		{
			var findXMLList : XMLList;
			var resultXml : XMLList = XMLList(getElementList( XML(__data), __compareNodeName ));
			var len : int = resultXml.length();
			for( var i:int = 0; i<len; i++ )
			{
				if( resultXml[i] == __compareValue )
				{
					findXMLList = XMLList( getElementList( XML(__data), __returnNodeName )[i] );
				}
			}
			
			return getObjFromResultData( findXMLList, "" );
			
		}
		
		/**
		 * @param __data : 최초 xml 데이타
		 * @param __compareNodeName : 비교하고자하는 노드 풀 네임. ( list.item.NUM )
		 * @param __compareValue : 비교하고자 하는 노드 값
		 * @param __returnNodeName : 리턴받고자 하는 노드 풀네임. ( list.item )
		 * @return Array 
		 */		
		public static function findItemAndGetList( __data:Object , __compareNodeName:String, __compareValue : String,  __returnNodeName:String = ""  ):Array
		{
			var findList : Array = [];
			var resultXml : XMLList = XMLList(getElementList( XML(__data), __compareNodeName ));
			var len : int = resultXml.length();
			for( var i:int = 0; i<len; i++ )
			{
				if( resultXml[i] == __compareValue )
				{
					findList.push( getObjFromResultData( XMLList( getElementList( XML(__data), __returnNodeName )[i] ), "" ) )
				}
			}
			
			return findList;
		}
		
		public static function query2xml(tmpAC:Array):XMLList{
			
			var parentElement:XMLList;
			var tmpStr:String;
			
			for(var i:int=0; i < tmpAC.length; i++) {
				
				// 최초 root element를 생성
				if (i==0){
					var xml:XML = new XML("<node><node DEPT_NUM='"+noNull(tmpAC[i].DEPT_NUM)+"' DEPT_NAME='"+noNull(tmpAC[i].DEPT_NAME)+"' DEPT_FULL_NAME='"+noNull(tmpAC[i].DEPT_FULL_NAME)+"' DEPT_ENG_NAME='"+noNull(tmpAC[i].DEPT_ENG_NAME)+"' DEPT_TYPE_CODE='"+noNull(tmpAC[i].DEPT_TYPE_CODE)+"' MANAGER_NAME='"+noNull(tmpAC[i].MANAGER_NAME)+"' MANAGER_NUM='"+noNull(tmpAC[i].MANAGER_NUM)+"' USE_SDATE='"+noNull(tmpAC[i].USE_SDATE)+"' USE_EDATE='"+noNull(tmpAC[i].USE_EDATE)+"' FORMAL_FLAG='"+noNull(tmpAC[i].FORMAL_FLAG)+"' PARENT_DEPT_NAME='' PARENT_DEPT_NUM='' root_dept_name='' ROOT_DEPT_NUM='' LEAF_FLAG='"+noNull(tmpAC[i].LEAF_FLAG)+"'/></node>");
					tmpStr = tmpAC[i].DEPT_NUM;
				} else {
					// 상위의 element를 찾아 add
					var newItem:XMLList = new XMLList("<node DEPT_NUM='"+noNull(tmpAC[i].DEPT_NUM)+"' DEPT_NAME='"+noNull(tmpAC[i].DEPT_NAME)+"' DEPT_FULL_NAME='"+noNull(tmpAC[i].DEPT_FULL_NAME)+"' DEPT_ENG_NAME='"+noNull(tmpAC[i].DEPT_ENG_NAME)+"' DEPT_TYPE_CODE='"+noNull(tmpAC[i].DEPT_TYPE_CODE)+"' MANAGER_NAME='"+noNull(tmpAC[i].MANAGER_NAME)+"' MANAGER_NUM='"+noNull(tmpAC[i].MANAGER_NUM)+"' USE_SDATE='"+noNull(tmpAC[i].USE_SDATE)+"' USE_EDATE='"+noNull(tmpAC[i].USE_EDATE)+"' FORMAL_FLAG='"+noNull(tmpAC[i].FORMAL_FLAG)+"' PARENT_DEPT_NAME='"+noNull(tmpAC[i].PARENT_DEPT_NAME)+"' PARENT_DEPT_NUM='"+noNull(tmpAC[i].PARENT_DEPT_NUM)+"' ROOT_DEPT_NAME='"+noNull(tmpAC[i].ROOT_DEPT_NAME)+"' ROOT_DEPTNUM='"+noNull(tmpAC[i].ROOT_DEPT_NUM)+"' LEAF_FLAG='"+noNull(tmpAC[i].LEAF_FLAG)+"'/>");
					
					parentElement = xml.descendants().(@DEPT_NUM==noNull(tmpAC[i].PARENT_DEPT_NUM));
					parentElement.* += newItem;
				}
			}
			
			parentElement = xml.descendants().(@DEPT_NUM==tmpStr);
			
			return parentElement;
		}
		
		public static function noNull(_str:String):String {
			
			var tmpStr:String;
			
			if (_str == null || _str == "null" || _str == "") {
				tmpStr = "";
			} else {
				tmpStr = _str;
			}
			return tmpStr;
		}
		
		/**
		 * 평면형태의 좌측메뉴 데이터를 계층구조로 변경
		 *  
		 * @param __data
		 * @param __nodeName1
		 * @param __nodeName2
		 * @param __labelName
		 * @param __my
		 * @return 
		 * 
		 */
		public static function rebuildXmlForMenu( __data:XML, __nodeName1:String, __nodeName2:String, __labelName:String, __my:Boolean = false ):XML {
			var data:XMLList = __data[__nodeName1][__nodeName2];
			var o:XML;
			var u:XML;
			for each( o in data ) {
				for each( u in o.children() ) {
					var name:String = u.localName();
					o['@'+name] = StringUtils.trim( o[name] );
					if( __labelName == name ) {
						o['@label'] = StringUtils.trim( o[name] );
					}
				}
				o.setChildren('');
			}
			var clone:XMLList = data.copy();
			var arr:Array = [];
			for( var i:int=0; i<clone.length(); i++ ) {
				var item:XML = clone[i];
				var parent:String = item['@PARENT_DEPT_NUM'];
				if( parent != null && parent != '' ) {
					for( var j:int = 0; j<clone.length(); j++ ) {
						var item2:XML = clone[j];
						if ( item2['@DEPT_NUM'] == parent ) {
							data[j].appendChild( item );
							arr.push( item['@DEPT_NUM'] );
						}
					}
				}
			}
			for( var k:int = 0; k<arr.length; k++ ) {
				var c:String = arr[k];
				for( var h:int = 0; h<data.length(); h++ ) {
					if( data[h]['@DEPT_NUM'] == c ) {
						delete data[h];
						break;
					}
				}
			}
			
			
			return __data;
		}
		
		
		private static function getElementList( __data:Object , __nodeName:String ):Object
		{
			if( __nodeName == "" ) return __data;
			
			var nodeList : Array = __nodeName.split(".");
			var obj : Object = __data;
			for( var idx:String in nodeList )
			{
				obj = obj.elements(nodeList[idx]);
			}
			
			return obj;
		}
		
		/**
		 * @param commonCodeList 공통코드리스트
		 * @param code 코드카테고리
		 * @return : 공통 카테고리 선택적 반환
		 */		
		public static function selectCommonCode( codeList:Array, code:String ):Array
		{
			var obj : Object;
			var arr : Array = [{LABEL:"전체", DATA:""}];
			var len : int = codeList.length;
			for( var i:int = 0; i < len; i++ )
			{
				if( StringUtils.trim( code ) == StringUtils.trim( codeList[ i ].CATEGROYCODE ) )
				{
					obj = new Object();
					obj.LABEL = StringUtils.trim( codeList[ i ].LABEL );
					obj.DATA = StringUtils.trim( codeList[ i ].DATA );
					arr.push( obj );
				}
			}
			
			return arr;
		}
		
	}
}